Jak zjistim, zda je TFrame na focused panelu?
Otázka od: Karel Kral
13. 9. 2004 14:41
Ahoj,
mam aplikaci, kde vlevo je TreeView pouzite jako menu a vpravo od nej
mam TPanel, na ktery dynamicky vkladam moduly - nasledniky TFrame -
podle toho, ktery uzel je vybrany.
Potreboval bych v tom modulu lezici vpravo od TreeView zjistit, zda je
prave Focused on nebo jiny objekt na obrazovce. Je jasne, ze TFrame
nemuze byt focused. Ale i Panel.Focused od panelu, ve kterem je vlozen
TFrame, mi vraci v kazde situaci false. Muzete mi nekdo poradit?
--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________
Odpovedá: Karel Kral
14. 9. 2004 11:32
Karel Kral napsal(a):
> Ahoj,
> Potreboval bych v tom modulu lezici vpravo od TreeView zjistit, zda je
> prave Focused on nebo jiny objekt na obrazovce. Je jasne, ze TFrame
> nemuze byt focused. Ale i Panel.Focused od panelu, ve kterem je vlozen
> TFrame, mi vraci v kazde situaci false. Muzete mi nekdo poradit?
Odpovim si sam - udelal jsem to celkem snadno ale prijde mi, ze snad
musi existovat nejaka jednodussi cesta nez toto:
// vraci true, pokud v Container je obsazeno view, ktere je Focused.
// Pouziva se napr. na zjisteni, zda nektere z view, ktere lezi na danem
// TPanel je ve stavu Focused.
function ContainerHasFocus(Container: TWinControl): boolean;
var
ParentForm: TCustomForm;
// vraci formular, ve kterem je vlozen Container. Prochazi vlastniky tak
// dlouho, az najde TCustomForm
function FindParentForm: TCustomForm;
var
P: TWinControl;
begin
Result := nil;
P := Container;
while P <> nil do
begin
if P is TCustomForm then
begin
Result := TCustomForm(P);
Break;
end;
P := P.Parent;
end; // while
end; // func
// prochazi vlastniky Control tak dlouho, dokud nenarazi na
StopAtControl nebo
// na konec. Vraci true, pokud je Control vlastneny StopAtControl
function TraverseParents(Control, StopAtControl: TWinControl): boolean;
var
P: TWinControl;
begin
Result := false;
P := Control;
while P <> nil do
begin
if P = StopAtControl then
begin
Result := true;
Break;
end;
P := P.Parent;
end; // while
end; // func
begin
Result := false;
ParentForm := FindParentForm;
if Assigned(ParentForm) then
Result := TraverseParents(ParentForm.ActiveControl, Container);
end;
--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________
Odpovedá: Ondrej Kelle
14. 9. 2004 12:11
> Je jasne, ze TFrame nemuze byt focused.
Ako to, ze nie? TFrame je potomok TWinControl, ma window handle. Metody
SetFocus, Focused funguju podla ocakavania. Problem bude asi niekde inde.
HTH
TOndrej